package com.dao;

import java.lang.reflect.Field;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import javax.annotation.Resource;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;


public class BaseDao<T> {
	@Resource
	  protected QueryRunner queryRunner;
	public static Map<String, Object[]> insertEntity(Object obj)
			throws IllegalArgumentException, IllegalAccessException, SQLException {
		Class clazz = obj.getClass();
		String tableName = clazz.getSimpleName();// 表名
		String sql = "insert into " + tableName;
		String collist = "(";// 字段列表
		String vallist = " values(";// 值列表
		Field[] fds = clazz.getDeclaredFields();
		// insert into Student(sno,name,sex) values(?,?,?);
		int count = 1;
		// 准备一个集合，将需要插入的字段类型和字段值 成对存放
		List<Object> parmas = new ArrayList<Object>();// 准备一个Object集合
														// 用于存放要插入的数据，以便直接将这个集合转换为Object[]
		// 目标任务1 打印出sql insert into (字段1，字段2) values(?,?)
		for (Field fd : fds) {
			String fdClassName = fd.getType().getSimpleName();// 得到字段的类型名称
			String fdName = fd.getName();
			fd.setAccessible(true);// 允许通过fd修改值
			Object fdval = fd.get(obj);// 得到obj对象对应的当前字段的值
			Optional stringVal = null;// 判空对象，回避 if(fdval!=null)
			String fdlistVal = null;// 拼接的值列表占位值？，根据是否是第一个字段区别

			stringVal = Optional.ofNullable(fdval);
			if (stringVal.isPresent() && !stringVal.get().toString().trim().equals("")) {// 如果本次的字段的值不为空，考虑是否在字段列表加，值列表要加值
				if (count > 1) {// 且这字段不是第一个 才在前面加,
					fdName = "," + fdName;
					fdlistVal = ",?";
				} else {
					fdlistVal = "?";
				}
				vallist += fdlistVal;
				collist += fdName;
				// System.out.println(collist);
				parmas.add(fdval);
				count++;

			}

		}
		collist += ")";
		vallist += ")";
		sql += collist + vallist;
		System.out.println(sql);

		Map<String, Object[]> result = new HashMap<String, Object[]>();
		result.put(sql, parmas.toArray());
		return result;

	}

	public Map<String, Object[]> updateEntity(Object obj) throws IllegalArgumentException, IllegalAccessException,
			SQLException, NoSuchFieldException, SecurityException {

		Class clazz = obj.getClass();
		String tableName = clazz.getSimpleName();// 表名
		String sql = "update " + tableName + " set ";

		Field[] fds = clazz.getDeclaredFields();
		// insert into Student(sno,name,sex) values(?,?,?);
		int count = 0;
		// 准备一个集合，将需要插入的字段类型和字段值 成对存放
		List<Object> parmas = new ArrayList<Object>();// 准备一个Object集合
														// 用于存放要插入的数据，以便直接将这个集合转换为Object[]
		// 目标任务1 打印出sql insert into (字段1，字段2) values(?,?)
		for (Field fd : fds) {
			String fdClassName = fd.getType().getSimpleName();// 得到字段的类型名称
			String fdName = fd.getName();
			fd.setAccessible(true);// 允许通过fd修改值
			Object fdval = fd.get(obj);// 得到obj对象对应的当前字段的值
			Optional stringVal = null;// 判空对象，回避 if(fdval!=null)
			String fdlistVal = null;// 拼接的值列表占位值？，根据是否是第一个字段区别

			stringVal = Optional.ofNullable(fdval);
			if (stringVal.isPresent() && !stringVal.get().toString().trim().equals("")) {// 如果本次的字段的值不为空，考虑是否在字段列表加，值列表要加值
				if (count == 0) {
					count++;
					continue;
				}
				if (count > 1) {// 且这字段不是第一个 才在前面加,
					fdName = "," + fdName + "=?";
				} else {
					fdName = fdName + "=?";
				}
				sql += fdName;
				// System.out.println(collist);
				parmas.add(fdval);
				count++;

			}

		}
		parmas.add(fds[0].get(obj));
		sql += " where " + fds[0].getName() + "=?";
		System.out.println(sql);

		Map<String, Object[]> result = new HashMap<String, Object[]>();
		result.put(sql, parmas.toArray());
		return result;
	}
}
